package net.xinqushi.design.bridge;

/**
 * @author xjie
 * @description log的桥接
 *   注:  SPI (Service Provider Interface) 就是桥接模式
 *   https://blog.csdn.net/yycdaizi/article/details/8276265
 */
public class Log {

    /**
     * common-logging是apache提供的一个通用的日志接口。
     * 用户可以自由选择第三方的日志组件作为具体实现
     * ，像log4j，或者jdk自带的logging， common-logging会通过动态查找的机制
     * ，在程序运行时自动找出真正使用的日志库。
     * 当然，common-logging内部有一个Simple logger的简单实现，
     * 但是功能很弱。所以使用common-logging，通常都是配合着log4j来使用。
     * 使用它的好处就是，代码依赖是common-logging而非log4j，
     * 避免了和具体的日志方案直接耦合，在有必要时，可以更改日志实现的第三方库。
     */

    /**
     * SPI比较常见的例子：
     *
     * 数据库驱动加载接口实现类的加载
     *      JDBC加载不同类型数据库的驱动
     * 日志门面接口实现类加载
     *      SLF4J加载不同提供商的日志实现类
     * Spring
     *      Spring中大量使用了SPI,比如：对servlet3.0规范对ServletContainerInitializer的实现、自动类型转换Type Conversion SPI(Converter SPI、Formatter SPI)等
     * Dubbo
     *      Dubbo中也大量使用SPI的方式实现框架的扩展, 不过它对Java提供的原生SPI做了封装，允许用户扩展实现Filter接口
     */
}
